import { initState } from './state';
import { compileToFunction } from './compile/index';
import { mountComponent, callHooks } from './lifecycle';
import { mergeOptions } from './utils';

export function initMixin(Vue) {
  // 初始化
  Vue.prototype._init = function (options) {
    const vm = this;
    // 混入用户写的 mixin
    vm.$options = mergeOptions(this.constructor.options, options);

    callHooks(vm, 'beforeCreate');

    // 初始化
    initState(vm);

    callHooks(vm, 'created');

    // 渲染模板
    if (options.el) {
      vm.$mount(options.el);
    }
  };

  Vue.prototype.$mount = function (el) {
    const vm = this;
    let options = vm.$options;
    el = document.querySelector(el);
    // 顺序： options 中 render -> template -> el
    if (!options.render) {
      let template;
      if (options.template) {
        template = options.template;
      } else if (el) {
        template = el.outerHTML;
      }
      if (template) {
        // 编译 render 函数
        const render = compileToFunction(template);
        options.render = render;
      }
    }
    mountComponent(vm, el); // 组件挂载
  };
}
